package com.leenmvc.core.dao.mysql;

import com.leenmvc.core.dao.communal.BaseDao;
import com.leenmvc.core.dao.communal.CommonDao;
import com.leenmvc.core.dao.mysql.mybatis.MybatisQuery;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * 实现类
 */
@Component
public class MysqlBaseDaoImpl extends CommonDao implements BaseDao, Serializable {

    private MysqlBaseDaoImpl() {
    }

    /**
     * 使用volatile关键字保证变量的可见性
     */
    private volatile static MysqlBaseDaoImpl baseDao = null;

    /**
     *
     * @return
     */
    public static MysqlBaseDaoImpl getInstance() {
        if (baseDao == null) {
            synchronized (MysqlBaseDaoImpl.class) {
                if (baseDao == null) {
                    baseDao = new MysqlBaseDaoImpl();
                }
            }
        }
        return baseDao;
    }

    /**
     * 从mapper中获取一个(参数为map)
     *
     * @param cls
     * @param batisKey
     * @param params
     * @param <T>
     * @return
     */
    @Override
    public <T> List<T> listBySqlKey(Class<?> cls, String batisKey, Map<String, Object> params) {
        return MybatisQuery.listBySqlKey(cls, batisKey, params);
    }

    /**
     * 从mabatis 的 mapper中获取列表(参数为map)
     *
     * @param cls
     * @param batisKey
     * @param params
     * @param <T>
     * @return
     */
    @Override
    public <T> T getBySqlKey(Class<?> cls, String batisKey, Map<String, Object> params) {
        return MybatisQuery.getBySqlKey(cls, batisKey, params);
    }

    /**
     * 从mybatis中获取一个列表（只有一个参数时）
     *
     * @param cls      实体类
     * @param batisKey sqlkey
     * @param param    参数
     * @param <T>
     * @return
     */
    @Override
    public <T> List<T> listBySqlKey(Class<?> cls, String batisKey, Object param) {
        return MybatisQuery.listBySqlKey(cls, batisKey, param);
    }

    /**
     * 从mybatis中获取一个记录（只有一个参数时候）
     *
     * @param cls      实体类
     * @param batisKey batis中key的值
     * @param param    参数
     * @param <T>
     * @return
     */
    @Override
    public <T> T getBySqlKey(Class<?> cls, String batisKey, Object param) {
        return MybatisQuery.getBySqlKey(cls, batisKey, param);
    }

    /**
     * 从mybatis中获取记录列表（参数为键值对）
     *
     * @param cls      实体类
     * @param batisKey sqlkey
     * @param KVs      参数
     * @param <T>
     * @return
     */
    @Override
    public <T> List<T> listBySqlKey(Class<?> cls, String batisKey, Object... KVs) {
        return MybatisQuery.listBySqlKey(cls, batisKey, KVs);
    }

    /**
     * 从mybatis中获取一条记录（参数为键值对）
     *
     * @param cls      实体类
     * @param batisKey
     * @param KVs      参数
     * @param <T>
     * @return
     */
    @Override
    public <T> T getBySqlKey(Class<?> cls, String batisKey, Object... KVs) {
        return MybatisQuery.getBySqlKey(cls, batisKey, KVs);
    }

}
